/*
 * 公共API控制器
 * 位于包：org.example.lethear.controller
 * 
 * 这个控制器提供不需要认证的公共接口，主要包括：
 * 1. 平台统计信息接口
 * 2. 最新帖子列表接口
 * 3. 其他公开的数据查询接口
 * 
 * 这些接口通常用于：
 * - 网站首页数据展示
 * - 移动应用的公开内容
 * - 搜索引擎优化（SEO）
 * - 第三方应用集成
 * 
 * 所有接口都无需用户认证，但可能有频率限制。
 */
package org.example.lethear.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.example.lethear.dto.post.PostDTO;
import org.example.lethear.entity.Post;
import org.example.lethear.repository.*;
import org.example.lethear.service.PostService;
import org.example.lethear.utils.Result;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 公共API控制器
 * 
 * @Tag - Swagger文档标签，用于API文档分组
 * @RestController - 标识这是一个REST控制器，返回JSON格式数据
 * @RequestMapping - 指定控制器的基础URL路径
 * @RequiredArgsConstructor - 自动生成构造函数注入依赖
 */
@Tag(name = "公共API", description = "不需要认证的公共接口")
@RestController
@RequestMapping("/public")
@RequiredArgsConstructor
public class PublicController {
    
    // 用户数据访问对象，用于查询用户统计信息
    private final UserRepository userRepository;
    
    // 帖子数据访问对象，用于查询帖子信息和统计
    private final PostRepository postRepository;
    
    // 评论数据访问对象，用于查询评论统计信息
    private final CommentRepository commentRepository;
    
    // 悄悄话数据访问对象，用于查询悄悄话统计信息
    private final WhisperRepository whisperRepository;
    
    // 帖子服务，用于处理帖子相关的复杂业务逻辑
    private final PostService postService;
    
    /**
     * 获取平台统计信息
     * 
     * 这个接口返回平台的基础统计数据，包括：
     * - 总用户数
     * - 总帖子数
     * - 总评论数
     * - 总悄悄话数
     * 
     * 通常用于首页展示平台规模和活跃度
     * 
     * @return Result<PlatformStats> 平台统计信息响应
     */
    @Operation(summary = "平台统计", description = "获取平台基础统计信息")
    @GetMapping("/stats")
    public Result<PlatformStats> getPlatformStats() {
        // 1. 统计激活用户数量
        // 只统计状态为1（激活）的用户，排除被禁用的用户
        long totalUsers = userRepository.countByStatus(1);
        
        // 2. 统计已发布帖子数量
        // 只统计状态为1（已发布）的帖子，排除草稿和已删除的帖子
        long totalPosts = postRepository.countByStatus(1);
        
        // 3. 统计正常评论数量
        // 只统计状态为1（正常）的评论，排除已删除的评论
        long totalComments = commentRepository.countByStatus(1);
        
        // 4. 统计正常悄悄话数量
        // 只统计状态为1（正常）的悄悄话，排除已删除的悄悄话
        long totalWhispers = whisperRepository.countByStatus(1);
        
        // 5. 构建平台统计对象
        // 使用Builder模式创建PlatformStats对象
        PlatformStats stats = PlatformStats.builder()
                .totalUsers(totalUsers)        // 总用户数
                .totalPosts(totalPosts)        // 总帖子数
                .totalComments(totalComments)  // 总评论数
                .totalWhispers(totalWhispers)  // 总悄悄话数
                .build();
        
        // 6. 返回成功响应
        return Result.success("获取成功", stats);
    }
    
    /**
     * 获取最新帖子列表
     * 
     * 这个接口返回最新发布的帖子列表，用于：
     * - 首页最新内容展示
     * - RSS源数据
     * - 移动应用的内容推荐
     * 
     * @param limit 返回的帖子数量限制，默认为5
     * @return Result<List<PostDTO>> 最新帖子列表响应
     */
    @Operation(summary = "最新帖子", description = "获取最新发布的帖子列表")
    @GetMapping("/latest-posts")
    public Result<List<PostDTO>> getLatestPosts(
            @Parameter(description = "数量限制") @RequestParam(defaultValue = "5") int limit) {
        
        // 1. 创建分页查询对象
        // PageRequest.of(页码, 每页大小, 排序规则)
        // 第0页表示第一页，limit表示每页大小
        // Sort.by("createTime").descending()表示按创建时间降序排列
        Pageable pageable = PageRequest.of(0, limit, Sort.by("createTime").descending());
        
        // 2. 查询最新发布的帖子
        // 只查询状态为1（已发布）的帖子
        Page<Post> postPage = postRepository.findByStatus(1, pageable);
        
        // 3. 将Post实体转换为PostDTO
        // 使用Stream API进行数据转换
        List<PostDTO> postDTOs = postPage.getContent().stream()
                .map(post -> {
                    try {
                        // 3.1 尝试获取帖子的详细信息
                        // PostService.getPostById会填充帖子的完整信息（作者、分类、统计等）
                        return postService.getPostById(post.getId());
                    } catch (Exception e) {
                        // 3.2 如果获取详细信息失败，创建简化版本
                        // 这样可以避免因为某个帖子的问题导致整个接口失败
                        return createSimplePostDTO(post);
                    }
                })
                .collect(Collectors.toList());
        
        // 4. 返回成功响应
        return Result.success("获取成功", postDTOs);
    }
    
    /**
     * 创建简化的PostDTO对象
     * 
     * 当无法获取帖子的完整信息时，创建一个包含基本信息的简化版本
     * 这是一个容错机制，确保API的稳定性
     * 
     * @param post 帖子实体对象
     * @return PostDTO 简化的帖子数据传输对象
     */
    private PostDTO createSimplePostDTO(Post post) {
        // 1. 创建PostDTO对象
        PostDTO dto = new PostDTO();
        
        // 2. 设置基本信息
        dto.setId(post.getId());                                  // 帖子ID
        dto.setTitle(post.getTitle());                            // 帖子标题
        dto.setContent(post.getContent());                        // 帖子内容
        dto.setSummary(post.getSummary());                        // 帖子摘要
        
        // 3. 设置统计信息
        // 将Integer类型转换为Long类型，避免类型不匹配
        dto.setViewCount(post.getViewCount().longValue());        // 浏览次数
        dto.setLikeCount(post.getLikeCount().longValue());        // 点赞次数
        dto.setCommentCount(post.getCommentCount().longValue());  // 评论次数
        
        // 4. 设置状态信息
        dto.setIsTop(post.getIsTop() == 1);                       // 是否置顶
        
        // 5. 设置时间信息
        dto.setCreatedAt(post.getCreateTime());                   // 创建时间
        dto.setUpdatedAt(post.getUpdateTime());                   // 更新时间
        
        // 6. 返回简化的DTO对象
        return dto;
    }
    
    /**
     * 平台统计信息数据传输对象
     * 
     * 这个内部类定义了平台统计信息的数据结构
     * 使用Lombok注解简化代码：
     * - @Data: 自动生成getter、setter、toString、equals、hashCode方法
     * - @Builder: 提供建造者模式支持
     * - @NoArgsConstructor: 生成无参构造函数
     * - @AllArgsConstructor: 生成全参构造函数
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class PlatformStats {
        
        /**
         * 总用户数
         * 统计所有激活状态的用户数量
         */
        private Long totalUsers;
        
        /**
         * 总帖子数
         * 统计所有已发布状态的帖子数量
         */
        private Long totalPosts;
        
        /**
         * 总评论数
         * 统计所有正常状态的评论数量
         */
        private Long totalComments;
        
        /**
         * 总悄悄话数
         * 统计所有正常状态的悄悄话数量
         */
        private Long totalWhispers;
    }
} 